class Book(object):
    # cls和self都不是关键字，可以是普通标识符
    # cls全称class ，表示当前类
    # __new__属于类方法，在创建对象时调用，且只调用一次

    def __new__(cls, *args, **kwargs):
        print("new方法被调用")
        # 注意：__new__必须有返回值值，并且必须是返回一个实例
        # super(Book, cls).__new__(cls)当前类创建出来的一个实例
        return super(Book, cls).__new__(cls)

    # self表示当前对象
    # __init__属于实例函数，在创建对象时调用，且只调用一次
    def __init__(self):
        print("init方法被调用")

    def read(self):  # 方法
        print("正在阅读")


b1 = Book()


# b1.read()
# 工作原理：
# 1.__new__:创建对象的时候首先自动调用__new__,它的作用创建实例，然后将该实例返回
# 2.__init__:接着，当实例创建完成之后被调用到此方法，然后通过__init__给实例设置初始值

# 3.__new__和__init__的区别：
# __new__先被调用，然后__init__被调用，__new__的返回值
# （实例）将传递给__init__的第一个参数self，然后__init__给这个实例设置一些参数，
# __init__不需要返回值

# object是所有类的父类，所有类都继承自object
class Student(object):
    slots = ('name', 'age', "hobby", 'score')

    # init与__init__的区别：init是普通方法，__init__是构造方法
    def init(self, a, b, c):
        self.name = a
        self.age = b
        self.hobby = c
        self.score = "60"

    def __init__(self, name, age, hobby, score):
        self.name = name
        self.age = age
        self.hobby = hobby
        self.score = score


# s = Student()
# s.init("小明", 18, "打篮球")
# print()
s = Student("张三", 18, "打篮球", "60")
print(s.name, s.age, s.hobby)

print("*" * 30)

#  将对象定义为全局变量，程序执行完毕，对象自动被销毁
class Animal(object):
    def __new__(self):
        print("__new__的实例函数被调用了")
        return super(Animal, self).__new__(self)

    def __init__(self):
        print("__init__的实例函数被调用了")

    def __del__(self):
        print("__del__的实例函数被调用了")


a = Animal()
print("jfjfjfjfjfjfjf")
# 先后顺序：__new__ 先被调用，然后__init__被调用，最后自动调用__del__进行销毁实例对象
